"""
4.8 创建集合(set)
本小节主要学习集合的基本定义、集合的特点以及如何创建集合，重点学习集合的三大
特性：互异性、确定性和无序性，以及创建集合的不同方法。
4.8.1 集合的基本概念
本知识点主要学习集合的基本概念和应用场景。
通过第三章已经学会用列表来存储数据。
集合的元素之间使用逗号“，”隔开，使用大括号“{}”来包括整个
集合，其语法格式如下：
集合变量名 = {元素 1, 元素 2, … , 元素 N}
"""
print('如果以列表的形式创建城市信息，那么将全量有序打印')
city_list = ['南京', '常州', '苏州', '南京', '常州']
print(city_list)
print('如果以集合形式创建城市信息，那么集合中将仅保留唯一城市名称，并且无序')
city_set = {'南京', '常州', '苏州', '南京', '常州'}
print(city_set)
print("*" * 100)

"""
强调一个内容：集合具有”无序性“(通过与列表List比较)
"""
set1 = {'张三', '180', 80}
set2 = {80, '张三','180'}
print(f'set1 和 set2 是否相同: {set1 == set2}')
print('做个比较')
list1 = ['张三', '180', 80]
list2 = [80, '张三','180']
print(f'list1 和 list2 是否相同: {list1 == list2}')
print("*" * 100)

"""
4.8.3 直接创建集合
按照集合的语法格式，直接创建集合，是最常用的创建集合方法，其语法格式如节 4.8.1
所示：
1. 第一种
集合变量名 = {元素 1, 元素 2, … , 元素 N}
注意：集合的元素必须是确定不可变的，而且元素之间没有次序。
2. 第二种
使用内置函数 set()创建集合
"""
print('第一种创建集合的方式')
m_set1 = {1,2,3,4,5}
print(m_set1)
print('第二种创建集合的方式')
m_set2 = set([1,2,3,4,5,6])
print(m_set2)
print("*" * 100)

"""
实战中关于集合的使用。
可以对列表去重
"""
"""
实验目的：将列表中的重复元素去去掉
"""
n_list = ['1','2','3','2','3','4']
print(f'n_list内容为：{n_list}')

print('传统做法是通过for循环比较列表中的元素，去重')
for i in n_list:
    pass

print('如果借用set可以做以下操作')
trans_set = set(n_list)
print(f'trans_set 内容为：{trans_set}')

print("*" * 100)

"""
4.9 集合运算
本小节主要学习集合的运算。集合除支持“in | not in”等部分通用运算操作之外，还支持
集合特有的运算：并集、交集、差集和对称差集。
4.9.1 集合的“in | not in”运算符
集合的用途主要有：删除重复元素和成员关系测试。由于集合的元素具有唯一性，成员
关系测试显得尤为重要。“in|not in”运算符，用来测试关键字是否存在于集合中，若存在，返
回“True”，反之，返回“False”。
"""
place_set = {'常州', '镇江', '无锡'}
res = "常州" in place_set # 返回值是True或False
res2 = "南京" not in place_set # 返回值是True或False
print(f'常州在集合中: {res}')
print(f'南京不在集合中: {res2}')
print("*" * 100)


"""
4.9.2 集合的并、交、差、对称差运算
本知识点主要学习两个集合之间的并集、交集、差集和对称差集运算，其语法格式如下：
1. 并集：属于集合 1 或者属于集合 2 的元素组成的新集合，其语法格式如下：
新集合变量名 = 集合 1 | 集合 2 
2. 交集：既集合 1 又属于集合 2 的元素组成的新集合，其语法格式如下：
新集合变量名 = 集合 1 & 集合 2 
3. 差集：属于集合 1 而不属于集合 2 的元素组成的新集合，其语法格式如下：
新集合变量名 = 集合 1 - 集合 2 
4. 对称差集：属于集合 1 而不属于集合 2，或者属于集合 2 而不属于集合 1 的元素组
成的新集合，其语法格式如下：
新集合变量名 = 集合 1 ^ 集合 2
"""
"""
并集
"""
a = {1,2,3}
b = {2,3,4}
print("取并集")
print(a|b)

"""
取交集
"""
print("取交集")
print(a&b)

"""
取差集
"""
print("取差集")
print(a - b)

"""
对称差集
"""
print('对称差集')
print(a ^ b)
print("*" * 100)

"""
4.10 集合的其他常用操作
本小节主要学习集合的一些常用操作：遍历集合，集合元素的增加和删除。在 Python 语
言中，可以使用内置函数和方法对集合进行操作，快速实现数据的编辑。
4.10.1 遍历集合
集合的元素是无序的，无法通过索引访问集合的元素，也没有类似字典的“键”可以用以
访问集合的元素，因此，想要查看集合的元素，只能通过遍历集合，将其中的元素逐个输出，
其语法格式如下：
for 变量名 in 集合变量名:
执行语句（缩进代码块）
"""
courses =  {'高数', '英语', 'Python'}
for c in courses:
    print(f'获取的课程名称是: {c}')
print("*" * 100)


"""
4.10.2 编辑集合
集合中元素的增加和删除，都有多种方法可以实现。常用的集合元素的增加和删除，其
语法格式如下：
1. 使用 add()方法实现集合元素的增加，其语法格式如下：
集合变量名.add(新元素) 
2. 使用 remove()方法实现集合元素的删除，其语法格式如下：
集合变量名.remove(被删除的元素)
"""
courses =  {'计算机网络', 'Linux 操作系统', '高数'}
courses.add('区块链导论')
print(f'新的课程集合内容为: {courses}')
courses.remove('高数')
print(f'删除元素后集合内容为: {courses}')
print("*" * 100)


"""
4.11 集合推导式
本小节主要学习集合推导式的使用，集合推导式与列表推导式、字典推导式的使用方法
类似，方便快速地生成集合。
1. 结合循环语句的集合推导式，其语法格式如下：
集合变量名 = {元素 for 变量名 in 可迭代对象} 
2. 结合循环语句和 if 语句的集合推导式，其语法格式如下：
集合变量名 = {元素 for 变量名 in 可迭代对象 if 条件判断语句}
其中，可迭代对象，可以是列表、字典、元组等对象。
"""
c_list = ['计算机网络', 'Linux 操作系统', '高数']
c_set = {name for name in c_list}
print(c_set)
student_list = [
    {
        'name':'张三'
    },
    {
        'name':'李四'
    }
]
c_set = {student['name'] for student in student_list}
print(c_set)